/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxline.atlasmobile.manager;

import br.com.foxline.atlasmobile.enums.*;
import br.com.foxline.model.*;
import br.com.foxline.service.BairroService;
import br.com.foxline.service.ImovelService;
import br.com.foxline.service.RegistrationService;
import br.com.foxline.util.Caracter;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.primefaces.model.chart.PieChartModel;
import org.primefaces.model.map.*;

/**
 *
 * @author ely
 */
@ViewScoped
@ManagedBean
public class ManagerImovel {

    @EJB
    ImovelService imovelDao;
    @EJB
    RegistrationService registrationService;
    @EJB
    BairroService bairroService;
    private Imovel imovel;
    private List<Imovel> imoveis;
    private Proprietario proprietario;
    private Endereco endereco;
    private String vImovel;
    private Imovel visaoImovel;
    private Imovel pesImovel;
    private Proprietario pesProprietario;
    private Endereco pesEndereco;
    private List<Annex> annexs;
    private Imovel imovelDelete;
    // Georreferenciamento
    LatLng latlong;
    private Coordenada coordenada;
    private List<Coordenada> coordenadas;
    private MapModel mapModel;
    private String convN;
    private String convE;
    private String convZona;
    private Coordenada editCoordenada;
    private Coordenada visuCoordenada;
    private Coordenada delCoordenada;
    private Coordenada posCoordenada;
    private Imovel imovelAverbacao;
    private String center;
    private String visaoInscricao = "";
    private List<Imovel> imoveisPendentes;
    private List<Imovel> resultPendentes;
    // Gráfico
    private PieChartModel graficoModel;
    private String grupo;
    private Bairro bairro;
    private List<String> selectedOptions;
    private static final String pendenteProprietario = "Proprietário";
    private static final String pendenteDocumentos = "Documentos";

    @PostConstruct
    public void init() {
        imovel = new Imovel();
        endereco = new Endereco();
        proprietario = new Proprietario();
        proprietario.setTipoDocumento(TipoDocumento.CPF);
        pesImovel = new Imovel();

        pesEndereco = new Endereco();
        pesProprietario = new Proprietario();
        pesProprietario.setTipoDocumento(TipoDocumento.CPF);

        coordenada = new Coordenada();
        coordenadas = new ArrayList<Coordenada>();

        resultPendentes = new ArrayList<Imovel>();
        bairro = new Bairro();

        selectedOptions = new ArrayList<String>();

        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        vImovel = params.get("vImovel");
        paramPost();

        createGraficoModel();

        plotar();
    }

    public void searchImovel() {
        proprietario.setCpf(Caracter.removecaracter(proprietario.getCpf()));
        proprietario.setCnpj(Caracter.removecaracter(proprietario.getCnpj()));
        endereco.setCep(Caracter.removecaracter(endereco.getCep()));
        imoveis = imovelDao.findImoveis(imovel, proprietario, endereco);
    }

    public void clear() {
        imoveis = new ArrayList<Imovel>();
    }

    public void plotar() {
        mapModel = new DefaultMapModel();
        LatLng coord = null;
        Polygon polygon = new Polygon();
        if (!coordenadas.isEmpty()) {
            for (Coordenada c : coordenadas) {
                coord = new LatLng(c.getLat(), c.getLog());
                center = c.getLat() + ", " + c.getLog();
                mapModel.addOverlay(new Marker(coord, visaoImovel.getProprietarios() + ""));
            }
        }
    }

    public String proprietartios(Imovel imovel) {
        return registrationService.getNomeProprietarios(imovel.getProprietarios());
    }

    public List<SelectItem> getPatrimonioList() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Patrimonio ms : Patrimonio.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public String getCenter() {
        return center;
    }

    public void setCenter(String center) {
        this.center = center;
    }

    public void visualizarCoordenada(Coordenada coordenada) {
        this.visuCoordenada = coordenada;
    }

    private void createGraficoModel() {
        graficoModel = new PieChartModel();

        graficoModel.set("Brand 1", 540);
        graficoModel.set("Brand 2", 325);
        graficoModel.set("Brand 3", 702);
        graficoModel.set("Brand 4", 421);
    }

    public void paramPost() {
        try {
            if (vImovel != null) {
                visaoImovel = imovelDao.find(Long.parseLong(vImovel));
                visaoImovel.setProprietarios(imovelDao.lstProprietario(visaoImovel));
                annexs = imovelDao.lstAnnexs(visaoImovel);
                coordenadas = imovelDao.lstCoordenadas(visaoImovel);
                if (visaoImovel.getEnderecoImovel() == null) {
                    visaoImovel.setEnderecoImovel(new Endereco());
                }
                if (visaoImovel.getEnderecoCorrespondencia() == null) {
                    visaoImovel.setEnderecoCorrespondencia(new Endereco());
                }
                if (visaoImovel.getDimensoes() == null) {
                    visaoImovel.setDimensoes(new Dimensao());
                }

                DecimalFormat d = new DecimalFormat("");
                d.setMinimumIntegerDigits(2);

                visaoInscricao += d.format(visaoImovel.getInscricaoCadastralD() == null ? 0 : visaoImovel.getInscricaoCadastralD());
                visaoInscricao += d.format(visaoImovel.getInscricaoCadastralS() == null ? 0 : visaoImovel.getInscricaoCadastralS());
                d.setMinimumIntegerDigits(3);
                visaoInscricao += d.format(visaoImovel.getInscricaoCadastralQuadra() == null ? 0 : visaoImovel.getInscricaoCadastralQuadra());
                d.setMinimumIntegerDigits(4);
                d.setDecimalSeparatorAlwaysShown(false);
                visaoInscricao += d.format(visaoImovel.getInscricaoCadastralLote() == null ? 0 : visaoImovel.getInscricaoCadastralLote());
                d.setMinimumIntegerDigits(2);
                visaoInscricao += d.format(visaoImovel.getInscricaoCadastralUnid() == null ? 0 : visaoImovel.getInscricaoCadastralUnid());

            }
            if (FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("p") != null) {
                if (FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("p").equals("true")) {
                    imovelPendente();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void reportRegImovel() {
        HashMap parametros = new HashMap();

        pesProprietario.setCpf(Caracter.removecaracter(pesProprietario.getCpf()));
        pesProprietario.setCnpj(Caracter.removecaracter(pesProprietario.getCnpj()));
        pesEndereco.setCep(Caracter.removecaracter(pesEndereco.getCep()));

        imovelDao.reportsAtlasMobileRegImovel(parametros, pesImovel, pesProprietario, pesEndereco);
    }

    public void reportVisaoImovel() {
        List<Imovel> list = new ArrayList<Imovel>();
        list.add(visaoImovel);
        imovelDao.reportCadastroGeral(new HashMap(), list);
    }

    public void imovelPendente() {

        if (!selectedOptions.isEmpty()) {
            if (selectedOptions.size() == 1) {
                if (selectedOptions.get(0).equals(pendenteDocumentos)) {
                    resultPendentes = imovelDao.imovelPendente(grupo, bairro, null, pendenteDocumentos);
                } else {
                    resultPendentes = imovelDao.imovelPendente(grupo, bairro, pendenteProprietario, null);
                }
            } else if (selectedOptions.size() == 2) {
                resultPendentes = imovelDao.imovelPendente(grupo, bairro, pendenteProprietario, pendenteDocumentos);
            }
        } else {
            resultPendentes = imovelDao.imovelPendente(grupo, bairro, null, null);
        }

    }

    /**
     * Relatório usado para a relação cadastral diferente do BCI
     */
    public void relatorioRelacaoCadastral() {
        HashMap parametros = new HashMap();

        proprietario.setCpf(Caracter.removecaracter(proprietario.getCpf()));
        pesProprietario.setCnpj(Caracter.removecaracter(pesProprietario.getCnpj()));
        pesEndereco.setCep(Caracter.removecaracter(pesEndereco.getCep()));

        imovelDao.relatorioRelacaoCadastral(parametros, imovel, proprietario, endereco);
    }

    public void relPendente() {
        imovelDao.relatorioPendencia(grupo);
    }

    public void redirect(String url) throws IOException {
        ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
        context.redirect(url + "?imovelId=" + imovelAverbacao.getId());
    }

    public void delete() {
        imoveis.remove(imovelDelete);
        imovelDao.delete(imovelDelete);
    }

    public Imovel getImovel() {
        return imovel;
    }

    public void setImovel(Imovel imovel) {
        this.imovel = imovel;
    }

    public List<Imovel> getImoveis() {
        return imoveis;
    }

    public void setImoveis(List<Imovel> imoveis) {
        this.imoveis = imoveis;
    }

    public Proprietario getProprietario() {
        return proprietario;
    }

    public void setProprietario(Proprietario proprietario) {
        this.proprietario = proprietario;
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public Imovel getVisaoImovel() {
        return visaoImovel;
    }

    public void setVisaoImovel(Imovel visaoImovel) {
        this.visaoImovel = visaoImovel;
    }

    public List<SelectItem> tipoDocumento() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        for (TipoDocumento tipo : TipoDocumento.values()) {
            items.add(new SelectItem(tipo.getTipo(), tipo.getNome()));
        }
        return items;
    }

    public List<SelectItem> getComando() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Comando ms : Comando.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getOcupacao() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Ocupacao ms : Ocupacao.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getTopografia() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Topografia ms : Topografia.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getSituacaoTerreno() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (SituacaoTerreno ms : SituacaoTerreno.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getPedologia() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Pedologia ms : Pedologia.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getUtilizacao() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Utilizacao ms : Utilizacao.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getPatrimonio() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Patrimonio ms : Patrimonio.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getUsoImovel() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (UsoImovel ms : UsoImovel.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getCaracterizacao() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Caracterizacao ms : Caracterizacao.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getComposicaoFamiliar() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (ComposicaoFamiliar ms : ComposicaoFamiliar.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getRendaFamiliar() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (RendaFamiliar ms : RendaFamiliar.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<Registration> getAverbacoes(Imovel imovel) {
        return registrationService.getByImovel(imovel);
    }

    public void printRegistration(Registration registration) {
        registrationService.printRegistration(registration);
    }

    public List<SelectItem> getRevExterno() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (RevExterno ms : RevExterno.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getVinculoTitularRip() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Vinculo ms : Vinculo.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getPiso() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Piso ms : Piso.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getForro() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Forro ms : Forro.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getCobertura() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Cobertura ms : Cobertura.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getInstSanitaria() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (InstSanitaria ms : InstSanitaria.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getPosicao() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Posicao ms : Posicao.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getTipoDocumentoImovel() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (TipoDocumentoImovel ms : TipoDocumentoImovel.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getTipoConstrucao() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (TipoConstrucao ms : TipoConstrucao.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getDominioTerra() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (DominioTerra ms : DominioTerra.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getEstrutura() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Estrutura ms : Estrutura.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getEstadoConservacao() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (EstadoConservacao ms : EstadoConservacao.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getInstalacoesEletrica() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (InstalacoesEletricas ms : InstalacoesEletricas.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<SelectItem> getFachada() {
        List<SelectItem> s = new ArrayList<SelectItem>();
        for (Fachada ms : Fachada.values()) {
            s.add(new SelectItem(ms, ms.getNome()));
        }
        return s;
    }

    public List<Bairro> getBairros() {
        List<Bairro> selectItems = new ArrayList<Bairro>();

        for (Bairro b : bairroService.findAll()) {
            selectItems.add(b);
        }
        return selectItems;
    }

    public HashMap<String, String> getTipoPendencia() {

        HashMap<String, String> tipoPendencia = new HashMap<String, String>();
        tipoPendencia.put("Proprietário", "Proprietário");
        tipoPendencia.put("Documentos", "Documentos");

        return tipoPendencia;
    }

    public Imovel getPesImovel() {
        return pesImovel;
    }

    public void setPesImovel(Imovel pesImovel) {
        this.pesImovel = pesImovel;
    }

    public Proprietario getPesProprietario() {
        return pesProprietario;
    }

    public void setPesProprietario(Proprietario pesProprietario) {
        this.pesProprietario = pesProprietario;
    }

    public Endereco getPesEndereco() {
        return pesEndereco;
    }

    public void setPesEndereco(Endereco pesEndereco) {
        this.pesEndereco = pesEndereco;
    }

    public List<Annex> getAnnexs() {
        return annexs;
    }

    public void setAnnexs(List<Annex> annexs) {
        this.annexs = annexs;
    }

    public LatLng getLatlong() {
        return latlong;
    }

    public void setLatlong(LatLng latlong) {
        this.latlong = latlong;
    }

    public Coordenada getCoordenada() {
        return coordenada;
    }

    public void setCoordenada(Coordenada coordenada) {
        this.coordenada = coordenada;
    }

    public List<Coordenada> getCoordenadas() {
        return coordenadas;
    }

    public void setCoordenadas(List<Coordenada> coordenadas) {
        this.coordenadas = coordenadas;
    }

    public MapModel getMapModel() {
        return mapModel;
    }

    public void setMapModel(MapModel mapModel) {
        this.mapModel = mapModel;
    }

    public Coordenada getVisuCoordenada() {
        return visuCoordenada;
    }

    public void setVisuCoordenada(Coordenada visuCoordenada) {
        this.visuCoordenada = visuCoordenada;
    }

    public Imovel getImovelAverbacao() {
        return imovelAverbacao;
    }

    public void setImovelAverbacao(Imovel imovelAverbacao) {
        this.imovelAverbacao = imovelAverbacao;
    }

    public Imovel getImovelDelete() {
        return imovelDelete;
    }

    public void setImovelDelete(Imovel imovelDelete) {
        this.imovelDelete = imovelDelete;
    }

    public String getVisaoInscricao() {
        return visaoInscricao;
    }

    public void setVisaoInscricao(String visaoInscricao) {
        this.visaoInscricao = visaoInscricao;
    }

    public List<Imovel> getImoveisPendentes() {
        return imoveisPendentes;
    }

    public void setImoveisPendentes(List<Imovel> imoveisPendentes) {
        this.imoveisPendentes = imoveisPendentes;
    }

    public List<Imovel> getResultPendentes() {
        return resultPendentes;
    }

    public void setResultPendentes(List<Imovel> resultPendentes) {
        this.resultPendentes = resultPendentes;
    }

    public PieChartModel getGraficoModel() {
        return graficoModel;
    }

    public void setGraficoModel(PieChartModel graficoModel) {
        this.graficoModel = graficoModel;
    }

    public String getGrupo() {
        return grupo;
    }

    public void setGrupo(String grupo) {
        this.grupo = grupo;
    }

    public String pendencias(Imovel item) {
        List<String> pendencias = new ArrayList<String>();
        String pendencia = "";

        if (item.getProprietarios() == null || item.getProprietarios().isEmpty()) {
            pendencias.add("Não Existe Proprietário");
        }
        if (item.getAnnex() == null || item.getAnnex().isEmpty()) {
            pendencias.add(pendenteDocumentos);
        }

        for (int i = 0; i < pendencias.size(); i++) {

            if (pendencias.size() > 1 && i > 0) {
                if (i < pendencias.size() - 1) {
                    pendencia += ", ";
                } else {
                    pendencia += " e ";
                }
            }
            pendencia += pendencias.get(i);
        }

        return pendencia += ".";
    }

    public Bairro getBairro() {
        return bairro;
    }

    public void setBairro(Bairro bairro) {
        this.bairro = bairro;
    }

    public List<String> getSelectedOptions() {
        return selectedOptions;
    }

    public void setSelectedOptions(List<String> selectedOptions) {
        this.selectedOptions = selectedOptions;
    }
}
